This file contains statistics and figures from the paper, “Molecular,
Cellular, and Developmental Organization of the Mouse Vomeronasal organ
at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma
Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.
The paper can be found here:
Molecular,
Cellular, and Developmental Organization of the Mouse Vomeronasal organ
at Single Cell Resolution
Molecular cascades separating the
neuronal lineages
PCA plot of V1R and V2R pseudotime principal curves across cell
types

Cell density plots across pseudotime for P14 and P56 mice
Summary of
Kolmogorov-Smirnov Test
Two-sample Kolmogorov-Smirnov test
data: p14.v1r.pseudotime$v1r.pseudotime and p56.v1r.pseudotime$v1r.pseudotime
D = 0.21438, p-value < 2.2e-16
alternative hypothesis: two-sided
Two-sample Kolmogorov-Smirnov test
data: p14.v2r.pseudotime$v2r.pseudotime and p56.v2r.pseudotime$v2r.pseudotime
D = 0.10572, p-value = 1.892e-13
alternative hypothesis: two-sided

Heatmap showing expression in pseudotime for genes that
differentially expressed between the V1R and V2R lineages. Heat
indicates Z-score values

Zoomed in UMAP of cell types early in the neuronal lineage

Feature plots for select genes expressed early in the neuronal
lineage





Violin plot of normalized expression for Neurog1 and Neurod1, split
by cell type

UMAP of INP, iVSN, iOSN, and mOSN cell types

Normalized expression of candidate genes for V1R/V2R/OSN lineage
determination - V1R expressing genes





Normalized expression of candidate genes for V1R/V2R/OSN lineage
determination






Feature plots of normalized gene expression for early differentially
expressed genes between V1R, V2R, and OSN lineages

Feature plots of normalized expression for Notch1 and Dll4

LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSAzIgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKPlRoaXMgZmlsZSBjb250YWlucyBzdGF0aXN0aWNzIGFuZCBmaWd1cmVzIGZyb20gdGhlIHBhcGVyLCAiTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uIiBieSBNYXggSGlsbHMgSnIuLCBMaW1laSBNYSwgQWkgRmFuZywgVGhlbG1hIENoaXJlbWJhLCBTZXRoIE1hbGxveSwgQWxsaXNvbiBTY290dCwgQW5vamEgUGVyZXJhLCBhbmQgQy4gUm9uIFl1LiAgICAKClRoZSBwYXBlciBjYW4gYmUgZm91bmQgaGVyZTogIAoKW01vbGVjdWxhciwgQ2VsbHVsYXIsIGFuZCBEZXZlbG9wbWVudGFsIE9yZ2FuaXphdGlvbiBvZiB0aGUgTW91c2UgVm9tZXJvbmFzYWwgb3JnYW4gYXQgU2luZ2xlIENlbGwgUmVzb2x1dGlvbl0oaHR0cHM6Ly9lbGlmZXNjaWVuY2VzLm9yZy9yZXZpZXdlZC1wcmVwcmludHMvOTczNTYjdGFiLWNvbnRlbnQpCgoqKiogIAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CgojIFItTWFya2Rvd24gR2xvYmFsIFNldHRpbmdzICAKCiMgU2V0LXVwIGEgZGVmYXVsdCBpbWFnZSBzaXplIG9mIDEwIFggMTAgaW5jaGVzLiBTdXBwcmVzcyB3YXJuaW5nCiMgYW5kIGVycm9yIG1lc3NhZ2VzLiBIaWRlIGNvZGUuCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjb21tZW50PSIiLAogICAgICAgICAgICAgICAgICAgICAgZXJyb3I9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgY2FjaGU9RkFMU0UpCgpgYGAKCmBgYHtyIGxpYnJhcmllcywgaW5jbHVkZT1GQUxTRX0KCiMgTGlicmFyeSBMb2FkaW5nICAKCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShraXQpOyBsaWJyYXJ5KHRpZHl2ZXJzZSk7IGxpYnJhcnkoc3RyaW5ncik7IGxpYnJhcnkocGxvdDNEKSAKICBsaWJyYXJ5KGdncGxvdDIpOyBsaWJyYXJ5KGRhdGEudGFibGUpOyBsaWJyYXJ5KG9yZy5NbS5lZy5kYikKICBsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeShTZXVyYXQpOyBsaWJyYXJ5KERCSSk7IGxpYnJhcnkoY293cGxvdCkKICBsaWJyYXJ5KE1hdHJpeCk7IGxpYnJhcnkoZ2xtR2FtUG9pKTsgbGlicmFyeShjaXJjbGl6ZSkKICBsaWJyYXJ5KHRpYmJsZSk7IGxpYnJhcnkoZ2dwdWJyKTsgbGlicmFyeShzdmdsaXRlKTsgbGlicmFyeShnZ3NpZ25pZikKICBsaWJyYXJ5KHN0YXRzKTsgbGlicmFyeSh2ZWdhbik7IGxpYnJhcnkoc2NhbGVzKTsgbGlicmFyeShjYXJldCkKICBsaWJyYXJ5KHBhdGNod29yayk7IGxpYnJhcnkocGxvdGx5KTsgbGlicmFyeShnZW9tdGV4dHBhdGgpCiAgbGlicmFyeShvcGVueGxzeCk7IGxpYnJhcnkoZ3JpZEV4dHJhKTsgbGlicmFyeShnZ3JlcGVsKQogIGxpYnJhcnkoR2VuZU92ZXJsYXApOyBsaWJyYXJ5KGJpb21hUnQpOyBsaWJyYXJ5KGdncG9pbnRkZW5zaXR5KQogIGxpYnJhcnkoc2xpbmdzaG90KTsgbGlicmFyeSh0cmFkZVNlcSk7IGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCiAgbGlicmFyeSh2aXJpZGlzKTsgbGlicmFyeShVcFNldFIpOyBsaWJyYXJ5KHBoZWF0bWFwKTsgbGlicmFyeShtc2lnZGJyKQogIGxpYnJhcnkoZmdzZWEpOyBsaWJyYXJ5KGdyaWQpOyBsaWJyYXJ5KElEUG1pc2MpOyBsaWJyYXJ5KE1BU1MpCiAgbGlicmFyeShSbWlzYyk7IGxpYnJhcnkoZ2dwbG90aWZ5KTsgbGlicmFyeShnZ3BtaXNjKTsgbGlicmFyeShzY2FsZXMpCiAgbGlicmFyeShoZWF0bWFwbHkpOyBsaWJyYXJ5KGRlbmRleHRlbmQpCn0pCgpgYGAKCmBgYHtyfQoKIyBHbG9iYWwgVmFyaWFibGVzCgojIFRoZSBob21lIGRpcmVjdG9yeQpob21lX2RpciA8LSAiL2wvWXUvWXVMYWIvQmlvaW5mb3JtYXRpY3MvcHJvamVjdHMvbWhoL3NjX1ZOTy8iCiMgRGlyZWN0b3J5IGZvciBzdG9yaW5nIGRhdGEgb2JqZWN0cyBhdCBjcnVjaWFsIHN0YWdlcwpvYmplY3RfZGlyIDwtIHBhc3RlMChob21lX2RpciwiZmluYWwuc2V1Lm9ianMvIikKIyBEaXJlY3RvcnkgZm9yIGltYWdlcyBmcm9tIHRoZSBmaW5hbCBhbmFseXNpcwppbWFnZV9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbF9pbWFnZXMvIikKYWRvYmVfaW1hZ2VzIDwtIHBhc3RlMChpbWFnZV9kaXIsICJhZG9iZV9pbGx1c3RyYXRvcl9zdmdfZmlsZXMvIikKIyBEaXJlY3RvcnkgZm9yIGltYWdlcyBmb3IgdGhlIGZpbmFsIHBhcGVyCmNsdXN0cmVlX2RpciA8LSBwYXN0ZTAoaW1hZ2VfZGlyLCJjbHVzdHJlZS8iKQojIEEgZGlyZWN0b3J5IGZvciBUcmFkZVNlcSBmaXRHQU0gb3V0cHV0CmZpdEdBTV9kaXIgPC0gcGFzdGUwKG9iamVjdF9kaXIsICJmaXRHQU0vIikKbW9lX2RpciA8LSAiL2wvWXUvWXVMYWIvQmlvaW5mb3JtYXRpY3MvcHJvamVjdHMvbWhoL21vbG5nXzI0MDdfMjQ1My9SX29iai8iCgojIE9QRU4gYGBgdm5vLnNldS5pbnRlZ3JhdGVkYGBgCmxvYWQoZmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJ2bm8uaW50ZWdyYXRlZC5wb3N0Q2VsbElEIikpCiNMb2FkIE5ldXJvbmFsIExpbmVhZ2UgU2V1cmF0IE9iamVjdCAgCmxvYWQoZmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJuZXVyb24uaW50ZWdyYXRlZC5wb3N0Q2VsbElEIikpCgojIFJlbmFtZSB1bmtub3duX21WU04gdG8gc1ZTTgpsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyhuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpW2xldmVscyhuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkJGNlbGxfdHlwZSk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSlbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKCiMgR2V0IGNvbG9yIHNjaGVtZSBmb3IgdGhlIHdob2xlIHZubyBkYXRhc2V0CnZuby5jZWxsX3R5cGUuY29sb3JzIDwtIGh1ZV9wYWwoKShsZW5ndGgobGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpKSkKbmFtZXModm5vLmNlbGxfdHlwZS5jb2xvcnMpIDwtIGxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KQoKIyBLZWVwIG5ldXJvbiBkYXRhc2V0IGNvbG9yIHNjaGVtZSBjb25zaXN0ZW50IHdpdGggdGhlIHdob2xlIHZubyBjb2xvciBzY2hlbWUsIHdoZXJlIHBvc3NpYmxlICAKbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMgPC0gdm5vLmNlbGxfdHlwZS5jb2xvcnNbYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIiwiVjFSX2lWU04iLCJWMlJfaVZTTiIsIkdCQyIpXQpuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSBzZXROYW1lcyhjKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzLCIjMDBCMEY2IiwiIzk1OTBGRiIsIiNFNzZCRjMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhuYW1lcyhuZXVyb24uY2VsbF90eXBlLmNvbG9ycyksImlPU04iLCJsYXRlX0lOUCIsImVhcmx5X0lOUCIpKQoKbWF0dXJlLm5ldXJvbnMgPC0gc3Vic2V0KG5ldXJvbi5pbnRlZ3JhdGVkLGlkZW50cz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKSkKbWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMgPC0gbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnNbYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIildCgpnbG9iYWwudmFycyA8LSBjKGxzKCksImdsb2JhbC52YXJzIikKCmBgYAoKKioqICAKCiMgTW9sZWN1bGFyIGNhc2NhZGVzIHNlcGFyYXRpbmcgdGhlIG5ldXJvbmFsIGxpbmVhZ2VzIHsudGFic2V0IC50YWJzZXQtcGlsbHN9ICAKCiMjIFBDQSBwbG90IG9mIFYxUiBhbmQgVjJSIHBzZXVkb3RpbWUgcHJpbmNpcGFsIGN1cnZlcyBhY3Jvc3MgY2VsbCB0eXBlcyAgCgpgYGB7cn0KCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidjFyLnYudjJyLnNldSIpKSAgICAgICAgICAgICAgICAgICAgICAgIyBTZXVyYXQgT2JqZWN0CmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwiaW5wLmludGVncmF0ZWQucHJlQ2VsbElEIikpICAgICAgICAgICAgIyBJTlAgU2V1cmF0IE9iamVjdApsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInYxci52LnYyci5zZHMiKSkgICAgICAgICAgICAgICAgICAgICAgICMgU2xpbmdzaG90IE9iamVjdApsb2FkKGZpbGU9cGFzdGUwKGZpdEdBTV9kaXIsInYxci52LnYyci5zY2UiKSkgICAgICAgICAgICAgICAgICAgICAgICMgTG9hZCB0aGUgdHJhZGVTZXEgb2JqZWN0CmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidjFyLnYudjJyLnBhdHRlcm5ERXJlcyIpKSAgICAgICAgICAgICAgIyBwYXR0ZXJuREUgdGVzdCByZXN1bHRzIG9iamVjdAoKYGBgCgpgYGB7cn0KCiMgRXh0cmFjdCBzbGluZ3Nob3QgcHJpbmNpcGFsIGN1cnZlcyBmb3IgcGxvdHRpbmcgd2l0aCBTZXVyYXQvZ2dwbG90Mgp2MXIuY3VydmUgPC0gc2xpbmdDdXJ2ZXModjFyLnYudjJyLnNkcylbWzJdXSAKdjFyLmN1cnZlIDwtIGRhdGEuZnJhbWUodjFyLmN1cnZlJHNbdjFyLmN1cnZlJG9yZCwgXSkKdjJyLmN1cnZlIDwtIHNsaW5nQ3VydmVzKHYxci52LnYyci5zZHMpW1sxXV0gCnYyci5jdXJ2ZSA8LSBkYXRhLmZyYW1lKHYyci5jdXJ2ZSRzW3Yyci5jdXJ2ZSRvcmQsIF0pCgpgYGAKCmBgYHtyfQoKdjFyLnYudjJyLnNldUBhY3RpdmUuaWRlbnQgPC0gdjFyLnYudjJyLnNldSRjZWxsX3R5cGUKIyBTZXQgdGhlIG9yZGVyIG9mIHRoZSBsZXZlbHMgZm9yIHRoZSBmYWN0b3IKdjFyLnYudjJyLnNldUBhY3RpdmUuaWRlbnQgPC0gZmFjdG9yKHYxci52LnYyci5zZXVAYWN0aXZlLmlkZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJHQkMiLCAiSU5QIiwgIlYxUi5JTlAiLCAiVjJSLklOUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjFSX2lWU04iLCAiVjJSX2lWU04iLCAiVjFSX21WU04iLCAiVjJSX21WU04iKSkKCmBgYAoKYGBge3J9Cgp0ZW1wLnBhbC4xIDwtIHdlc2FuZGVyc29uOjp3ZXNfcGFsZXR0ZSgiR3JhbmRCdWRhcGVzdDEiKQp0ZW1wLnBhbC4yIDwtIHdlc2FuZGVyc29uOjp3ZXNfcGFsZXR0ZSgiR3JhbmRCdWRhcGVzdDIiKQpwYWwgPC0gYyh0ZW1wLnBhbC4xLHRlbXAucGFsLjIpCm5hbWVzKHBhbCkgPC0gbGV2ZWxzKHYxci52LnYyci5zZXVAYWN0aXZlLmlkZW50KQojIFNhdmUgdGhlIDJEIFBDQSBvZiBDZWxsIFR5cGVzIHdpdGggVjFSIGFuZCBWMlIgUHJpbmNpcGFsIEN1cnZlcwpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnM19hLnN2ZyIpLHdpZHRoPTYsaGVpZ2h0PTYpCmZpZzNfYSA8LSBEaW1QbG90KHYxci52LnYyci5zZXUsIHJlZHVjdGlvbj0icGNhIiwgcHQuc2l6ZT0yLCBzaHVmZmxlPVRSVUUsIGNvbHM9cGFsKSArCiAgZ2VvbV9wYXRoKGRhdGE9djFyLmN1cnZlLCBhZXMoeD1QQ18xLCB5PVBDXzIpLCBzaXplPTAuMDUsIGNvbD0iYmxhY2siKSArCiAgZ2VvbV9wYXRoKGRhdGE9djJyLmN1cnZlLCBhZXMoeD1QQ18xLCB5PVBDXzIpLCBzaXplPTAuMDUsIGNvbD0iYmx1ZSIpICsKICBnZW9tX2xhYmVscGF0aChkYXRhPXYxci5jdXJ2ZSwgYWVzKHg9UENfMSx5PVBDXzIpLCBzaXplPTQuNSwgbGFiZWw9IlYxUiIsIGhqdXN0PTAuOCwKICAgICAgICAgICAgICAgICBmb250ZmFjZT0iYm9sZCIpICsKICBnZW9tX2xhYmVscGF0aChkYXRhPXYyci5jdXJ2ZSwgYWVzKHg9UENfMSx5PVBDXzIpLCBzaXplPTQuNSwgbGFiZWw9IlYyUiIsIGhqdXN0PTAuOCwgCiAgICAgICAgICAgICAgICAgY29sb3VyPSJibHVlIiwgZm9udGZhY2U9ImJvbGQiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMS4wLCB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIyKSwgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLCBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG5yb3cgPSAyKSkKICAKcm0odGVtcC5wYWwuMSx0ZW1wLnBhbC4yKQoKZmlnM19hCmludmlzaWJsZShkZXYub2ZmKCkpCgpgYGAKCmBgYHtyLGZpZy53aWR0aD0xMixmaWcuaGVpZ2h0PTEyfQoKIyBWMVIvVjJSIFByaW5jaXBhbCBDdXJ2ZXMgIAojIFBsb3QgdGhlIDJEIFBDQSBvZiBDZWxsIFR5cGVzIHdpdGggVjFSIGFuZCBWMlIgUHJpbmNpcGFsIEN1cnZlcwpmaWczX2EKCmBgYAoKIyMgQ2VsbCBkZW5zaXR5IHBsb3RzIGFjcm9zcyBwc2V1ZG90aW1lIGZvciBQMTQgYW5kIFA1NiBtaWNlICAKCmBgYHtyfQoKIyBDYWxjdWxhdGUgcHNldWRvdGltZXMKdjFyLnYudjJyLnB0IDwtIHNsaW5nUHNldWRvdGltZSh2MXIudi52MnIuc2RzLCBuYT1GQUxTRSkKdjFyLnYudjJyLnNldSA8LSBBZGRNZXRhRGF0YSh2MXIudi52MnIuc2V1LCB2MXIudi52MnIucHRbICwyXSwgY29sLm5hbWUgPSAidjFyLnBzZXVkb3RpbWUiKQp2MXIudi52MnIuc2V1IDwtIEFkZE1ldGFEYXRhKHYxci52LnYyci5zZXUsIHYxci52LnYyci5wdFsgLDFdLCBjb2wubmFtZSA9ICJ2MnIucHNldWRvdGltZSIpCgojIEFkZCBjZWxsLXdlaWdodHMKdjFyLmN3IDwtIGFzLmludGVnZXIodjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIkdCQyIgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxci52LnYyci5zZXUkY2VsbF90eXBlID09ICJJTlAiIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxci52LnYyci5zZXUkY2VsbF90eXBlID09ICJWMVIuSU5QIiB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxci52LnYyci5zZXUkY2VsbF90eXBlID09ICJWMVJfaVZTTiIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIlYxUl9tVlNOIikKdjJyLmN3IDwtIGFzLmludGVnZXIodjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIkdCQyIgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxci52LnYyci5zZXUkY2VsbF90eXBlID09ICJJTlAiIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxci52LnYyci5zZXUkY2VsbF90eXBlID09ICJWMlIuSU5QIiB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxci52LnYyci5zZXUkY2VsbF90eXBlID09ICJWMlJfaVZTTiIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIlYyUl9tVlNOIikKdjFyLnYudjJyLnNldSA8LSBBZGRNZXRhRGF0YSh2MXIudi52MnIuc2V1LCB2MXIuY3csIGNvbC5uYW1lID0gInYxci5jdyIpCnYxci52LnYyci5zZXUgPC0gQWRkTWV0YURhdGEodjFyLnYudjJyLnNldSwgdjJyLmN3LCBjb2wubmFtZSA9ICJ2MnIuY3ciKQoKYGBgCgpgYGB7cn0KCnYxci52LnYyci5wc2V1ZG90aW1lIDwtIEZldGNoRGF0YSh2MXIudi52MnIuc2V1LHZhcnM9YygiY2VsbF90eXBlIiwiYWdlIiwidjFyLnBzZXVkb3RpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInYyci5wc2V1ZG90aW1lIiwidjFyLmN3IiwidjJyLmN3IikpCgp2MXIudi52MnIucHNldWRvdGltZSRjZWxsX3R5cGUgPC0gCiAgZmFjdG9yKHYxci52LnYyci5wc2V1ZG90aW1lJGNlbGxfdHlwZSwKICAgICAgICAgbGV2ZWxzPWMoIkdCQyIsIklOUCIsIlYxUi5JTlAiLCJWMlIuSU5QIiwiVjFSX2lWU04iLAogICAgICAgICAgICAgICAgICAiVjJSX2lWU04iLCJWMVJfbVZTTiIsIlYyUl9tVlNOIikpCgpgYGAKCltTdW1tYXJ5IG9mIEtvbG1vZ29yb3YtU21pcm5vdiBUZXN0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Lb2xtb2dvcm924oCTU21pcm5vdl90ZXN0KSAgCgpgYGB7cn0KCiMgU3Vic2V0IHRoZSBjZWxscyBmb3IgZWFjaCBsaW5lYWdlCnYxci5wc2V1ZG90aW1lIDwtIHYxci52LnYyci5wc2V1ZG90aW1lW3Yxci52LnYyci5wc2V1ZG90aW1lJHYxci5jdz09MSwgXQp2MXIucHNldWRvdGltZSA8LSBzdWJzZXQodjFyLnBzZXVkb3RpbWUsc2VsZWN0PWMoY2VsbF90eXBlLGFnZSx2MXIucHNldWRvdGltZSx2MXIuY3cpKQp2MXIucHNldWRvdGltZSRjZWxsX3R5cGUgPC0gZHJvcGxldmVscyh2MXIucHNldWRvdGltZSRjZWxsX3R5cGUpCnYyci5wc2V1ZG90aW1lIDwtIHYxci52LnYyci5wc2V1ZG90aW1lW3Yxci52LnYyci5wc2V1ZG90aW1lJHYyci5jdz09MSwgXQp2MnIucHNldWRvdGltZSA8LSBzdWJzZXQodjJyLnBzZXVkb3RpbWUsc2VsZWN0PWMoY2VsbF90eXBlLGFnZSx2MnIucHNldWRvdGltZSx2MnIuY3cpKQp2MnIucHNldWRvdGltZSRjZWxsX3R5cGUgPC0gZHJvcGxldmVscyh2MnIucHNldWRvdGltZSRjZWxsX3R5cGUpCgojIEdldCBhZ2Ugc3BlY2lmaWMgY2VsbHMgZm9yIHN0YXRpc3RpY2FsIHRlc3QKcDE0LnYxci5wc2V1ZG90aW1lIDwtIHYxci5wc2V1ZG90aW1lW3Yxci5wc2V1ZG90aW1lJGFnZT09IlAxNCIsIF0KcDU2LnYxci5wc2V1ZG90aW1lIDwtIHYxci5wc2V1ZG90aW1lW3Yxci5wc2V1ZG90aW1lJGFnZT09IlA1NiIsIF0KcDE0LnYyci5wc2V1ZG90aW1lIDwtIHYyci5wc2V1ZG90aW1lW3Yyci5wc2V1ZG90aW1lJGFnZT09IlAxNCIsIF0KcDU2LnYyci5wc2V1ZG90aW1lIDwtIHYyci5wc2V1ZG90aW1lW3Yyci5wc2V1ZG90aW1lJGFnZT09IlA1NiIsIF0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIEtvbG1vZ29yb3YtU21pcm5vdiBUZXN0ICMjIyAgCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKa3MudGVzdChwMTQudjFyLnBzZXVkb3RpbWUkdjFyLnBzZXVkb3RpbWUscDU2LnYxci5wc2V1ZG90aW1lJHYxci5wc2V1ZG90aW1lKQoKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCnBhbCA8LSB3ZXNhbmRlcnNvbjo6d2VzX3BhbGV0dGUoIkRhcmplZWxpbmcxIiw0LCJkaXNjcmV0ZSIpCgpmaWczX2IucGFydF8xIDwtIGdnZGVuc2l0eShkYXRhPXYxci5wc2V1ZG90aW1lLCB4PSJ2MXIucHNldWRvdGltZSIsCiAgICAgICAgICAgICAgICAgICAgY29sb3I9ImFnZSIsZmlsbD0iYWdlIix0aXRsZT0iVjFSIikgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xLCBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTIwKSwgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGhqdXN0PTAuNSxzaXplPTI4KSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjApKSArCiAgeGxhYigicHNldWRvdGltZSIpICsgCiAgYW5ub3RhdGUoInRleHQiLHg9MTAwLHk9MC4wNSxsYWJlbD0icC12YWx1ZSA8IDIuMmUtMTYiLHNpemU9MjAvLnB0KSArCiAgYW5ub3RhdGUoCiAgICB5bWluID0gLTAuMDAxLCB5bWF4ID0gLTAuMDAwMywKICAgIHhtaW4gPSBjKDAsIDYzLCAxNTAsIDIwMCksCiAgICB4bWF4ID0gYyg2MywgMTUwLCAyMDAsIDIzNyksCiAgICBnZW9tID0gInJlY3QiLAogICAgZmlsbCA9IGMocGFsWzJdLHBhbFszXSxwYWxbNF0scGFsWzFdKQogICkgKwogIGFubm90YXRlKCJ0ZXh0Iix4PTMxLHk9LTAuMDAyNSxsYWJlbD0iR0JDIixzaXplPTE2Ly5wdCkgKwogIGFubm90YXRlKCJ0ZXh0Iix4PTEwNix5PS0wLjAwMjUsbGFiZWw9IklOUCIsc2l6ZT0xNi8ucHQpICsKICBhbm5vdGF0ZSgidGV4dCIseD0xNzUseT0tMC4wMDI1LGxhYmVsPSJpVlNOIixzaXplPTE2Ly5wdCkgKwogIGFubm90YXRlKCJ0ZXh0Iix4PTIxOCx5PS0wLjAwMjUsbGFiZWw9Im1WU04iLHNpemU9MTYvLnB0KQogIApgYGAKCmBgYHtyfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMgS29sbW9nb3Jvdi1TbWlybm92IFRlc3QgIyMjICAKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwprcy50ZXN0KHAxNC52MnIucHNldWRvdGltZSR2MnIucHNldWRvdGltZSxwNTYudjJyLnBzZXVkb3RpbWUkdjJyLnBzZXVkb3RpbWUpCgpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKZmlnM19iLnBhcnRfMiA8LSBnZ2RlbnNpdHkoZGF0YT12MnIucHNldWRvdGltZSwgeD0idjJyLnBzZXVkb3RpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPSJhZ2UiLGZpbGw9ImFnZSIsdGl0bGU9IlYyUiIpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSwgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yMCksIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLCBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUsc2l6ZT0yOCksCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTIwKSkgKwogIHhsYWIoInBzZXVkb3RpbWUiKSArIAogIGFubm90YXRlKCJ0ZXh0Iix4PTE0MCx5PTAuMDMsbGFiZWw9InAtdmFsdWU6IDEuODkyZS0xMyIsc2l6ZT0yMC8ucHQpICsKICBhbm5vdGF0ZSgKICAgIHltaW4gPSAtMC4wMDEsIHltYXggPSAtMC4wMDAzLAogICAgeG1pbiA9IGMoMCwgNjIsIDE1NiwgMjI1KSwKICAgIHhtYXggPSBjKDYyLCAxNTYsIDIyNSwgMjcyKSwKICAgIGdlb20gPSAicmVjdCIsCiAgICBmaWxsID0gYyhwYWxbMl0scGFsWzNdLHBhbFs0XSxwYWxbMV0pCiAgKSArCiAgYW5ub3RhdGUoInRleHQiLHg9MzEseT0tMC4wMDI1LGxhYmVsPSJHQkMiLHNpemU9MTYvLnB0KSArCiAgYW5ub3RhdGUoInRleHQiLHg9MTA5LHk9LTAuMDAyNSxsYWJlbD0iSU5QIixzaXplPTE2Ly5wdCkgKwogIGFubm90YXRlKCJ0ZXh0Iix4PTE5MCx5PS0wLjAwMjUsbGFiZWw9ImlWU04iLHNpemU9MTYvLnB0KSArCiAgYW5ub3RhdGUoInRleHQiLHg9MjQ5LHk9LTAuMDAyNSxsYWJlbD0ibVZTTiIsc2l6ZT0xNi8ucHQpCgpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKZmlnM19iIDwtIGdnYXJyYW5nZShwbG90bGlzdD1saXN0KFYxUj1maWczX2IucGFydF8xLFYyUj1maWczX2IucGFydF8yKSwKICAgICAgICAgICAgICAgICAgICBucm93PTEsbmNvbD0yLGNvbW1vbi5sZWdlbmQ9VFJVRSxsZWdlbmQ9InJpZ2h0IikKCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWczX2Iuc3ZnIiksIHdpZHRoPTEyLCBoZWlnaHQ9NikKZmlnM19iCmludmlzaWJsZShkZXYub2ZmKCkpCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTIsZmlnLmhlaWdodD02fQoKZmlnM19iCgpgYGAKCiMjIEhlYXRtYXAgc2hvd2luZyBleHByZXNzaW9uIGluIHBzZXVkb3RpbWUgZm9yIGdlbmVzIHRoYXQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGJldHdlZW4gdGhlIFYxUiBhbmQgVjJSIGxpbmVhZ2VzLiBIZWF0IGluZGljYXRlcyBaLXNjb3JlIHZhbHVlcyAgCgpgYGB7cn0KCmdlbmUuY291bnRzIDwtIEdldEFzc2F5RGF0YShvYmplY3Q9djFyLnYudjJyLnNldSwgc2xvdD0iZGF0YSIpCmdlbmUudG90LmNvdW50cyA8LSByb3dTdW1zKGdlbmUuY291bnRzKQojIE9ubHkga2VlcCBnZW5lcyB3aXRoIG1vcmUgdGhhbiAxMDAgdG90YWwgbm9ybWFsaXplZCBjb3VudHMKZ2VuZS50b3QuY291bnRzIDwtIGdlbmUudG90LmNvdW50c1tnZW5lLnRvdC5jb3VudHMgPj0gMzAwXQoKc2lnLnYxci52LnYyci5wYXR0ZXJuREVyZXMgPC0gdjFyLnYudjJyLnBhdHRlcm5ERXJlc1tuYW1lcyhnZW5lLnRvdC5jb3VudHMpLCBdCnNpZy52MXIudi52MnIucGF0dGVybkRFcmVzIDwtIG5hLm9taXQoc2lnLnYxci52LnYyci5wYXR0ZXJuREVyZXMpCiMgS2VlcCBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAtdmFsdWUg4omkIDAuMDAxCnBhdHRlcm5ERS5nZW5lcyA8LSByb3duYW1lcyhzaWcudjFyLnYudjJyLnBhdHRlcm5ERXJlcylbc2lnLnYxci52LnYyci5wYXR0ZXJuREVyZXMkcGFkaiA8PSAxZS0zXQoKcm0oZ2VuZS5jb3VudHMsZ2VuZS50b3QuY291bnRzKQoKYGBgCgpgYGB7cn0KCmNvbG9ycyA8LSBjKCIjMDA3RkZGIiwgIiMyRThCNTciLCAiI0ZGRkY2NiIsICIjRkZBNTAwIiwgIiNGRjAwMDAiKQojIEN1c3RvbSBjb2xvciBwYWxldHRlICAKcGFsZXR0ZSA8LSBjb2xvclJhbXBQYWxldHRlKGNvbG9ycykKCiMjIyBiYXNlZCBvbiBtZWFuIHNtb290aGVyCnBhdHRlcm5ERS55aGF0U21vb3RoIDwtIHByZWRpY3RTbW9vdGgobW9kZWxzPXYxci52LnYyci5zY2UsZ2VuZT1wYXR0ZXJuREUuZ2VuZXMsblBvaW50cz01MCx0aWR5PUZBTFNFKQpwYXR0ZXJuREUueWhhdFNtb290aFNjYWxlZCA8LSB0KHNjYWxlKHQocGF0dGVybkRFLnloYXRTbW9vdGgpKSkKcGF0dGVybkRFLmhlYXRTbW9vdGhfVjFSIDwtIHBoZWF0bWFwKHBhdHRlcm5ERS55aGF0U21vb3RoU2NhbGVkWyAsYyg1MToxMDApXSwgZm9udHNpemUgPSAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXBhbGV0dGUobj01MCksIGNsdXN0ZXJfY29scz1GQUxTRSxjbHVzdGVyX3Jvd3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfcm93bmFtZXM9RkFMU0Usc2hvd19jb2xuYW1lcz1GQUxTRSx0cmVlaGVpZ2h0X3Jvdz0zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW49IlYxUiIsIGxlZ2VuZD1GQUxTRSwgc2lsZW50PVRSVUUpCgpwYXR0ZXJuREUubWF0Y2hpbmdIZWF0bWFwX1YyUiA8LSAKICBwaGVhdG1hcChwYXR0ZXJuREUueWhhdFNtb290aFNjYWxlZFtwYXR0ZXJuREUuaGVhdFNtb290aF9WMVIkdHJlZV9yb3ckb3JkZXIsYygxOjUwKV0sCiAgICAgICAgICAgY29sb3I9cGFsZXR0ZShuPTUwKSwgY2x1c3Rlcl9jb2xzPUZBTFNFLCBjbHVzdGVyX3Jvd3M9RkFMU0UsCiAgICAgICAgICAgc2hvd19yb3duYW1lcz1GQUxTRSwgc2hvd19jb2xuYW1lcz1GQUxTRSwgZm9udHNpemUgPSAxMiwKICAgICAgICAgICBtYWluPSJWMlIiLCBsZWdlbmQ9VFJVRSwgc2lsZW50PVRSVUUpCgpncmlkLmFycmFuZ2UocGF0dGVybkRFLmhlYXRTbW9vdGhfVjFSW1s0XV0sIHBhdHRlcm5ERS5tYXRjaGluZ0hlYXRtYXBfVjJSW1s0XV0sIG5jb2wgPSAyLCB3aWR0aHM9YygxLDEuMDEpKQoKYGBgCgojIyBab29tZWQgaW4gVU1BUCBvZiBjZWxsIHR5cGVzIGVhcmx5IGluIHRoZSBuZXVyb25hbCBsaW5lYWdlICAKCmBgYHtyfQoKSWRlbnRzKGlucC5pbnRlZ3JhdGVkKSA8LSBhcy5mYWN0b3IoaW5wLmludGVncmF0ZWQkY2VsbF90eXBlKQojIFNldCB0aGUgb3JkZXIgb2YgdGhlIGxldmVscyBmb3IgdGhlIGZhY3RvcgppbnAuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQgPC0gZmFjdG9yKGlucC5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZWFybHlfSU5QIiwgImxhdGVfSU5QIiwgIlYxUl9pVlNOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWMlJfaVZTTiIsICJpT1NOIiwgIm1PU04iKSkKCgpgYGAKCmBgYHtyfQoKZmlnM19kIDwtIERpbVBsb3QobmV1cm9uLmludGVncmF0ZWQsbGFiZWw9VFJVRSxsYWJlbC5zaXplPTgscHQuc2l6ZT0xLjUpICsgCiAgTm9MZWdlbmQoKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTMsNCkseGxpbT1jKDguNSwxNSkpCmZpZzNfZAoKYGBgCgojIyBGZWF0dXJlIHBsb3RzIGZvciBzZWxlY3QgZ2VuZXMgZXhwcmVzc2VkIGVhcmx5IGluIHRoZSBuZXVyb25hbCBsaW5lYWdlICAKCmBgYHtyfQoKRmVhdHVyZVBsb3QobmV1cm9uLmludGVncmF0ZWQsZmVhdHVyZXM9YygiQXNjbDEiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0zLDQpLHhsaW09Yyg4LjUsMTUpKQoKRmVhdHVyZVBsb3QobmV1cm9uLmludGVncmF0ZWQsZmVhdHVyZXM9YygiU294MiIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTMsNCkseGxpbT1jKDguNSwxNSkpCgpGZWF0dXJlUGxvdChuZXVyb24uaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJOZXVyb2QxIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMyw0KSx4bGltPWMoOC41LDE1KSkKCkZlYXR1cmVQbG90KG5ldXJvbi5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIk5ldXJvZzEiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0zLDQpLHhsaW09Yyg4LjUsMTUpKQoKRmVhdHVyZVBsb3QobmV1cm9uLmludGVncmF0ZWQsZmVhdHVyZXM9YygiU3A4Iiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMyw0KSx4bGltPWMoOC41LDE1KSkKCmBgYAoKIyMgVmlvbGluIHBsb3Qgb2Ygbm9ybWFsaXplZCBleHByZXNzaW9uIGZvciBOZXVyb2cxIGFuZCBOZXVyb2QxLCBzcGxpdCBieSBjZWxsIHR5cGUgIAoKYGBge3IsZmlnLndpZHRoPTE1LGZpZy5oZWlnaHQ9Ny41fQoKIyBPcmRlciB0aGUgY2VsbC10eXBlcyAKIyBPcmRlciB0aGUgZ2VuZSBmYWN0b3IgbGV2ZWxzCm5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSA8LQogIGZhY3RvcihuZXVyb24uaW50ZWdyYXRlZCRjZWxsX3R5cGUsIGxldmVscz1jKCJHQkMiLCJlYXJseV9JTlAiLCJsYXRlX0lOUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYxUl9pVlNOIiwiVjJSX2lWU04iLCJpT1NOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIikpCm5ldXJvbi5jZWxsX3R5cGUuY29sb3JzIDwtIAogIG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzW2MoIkdCQyIsImVhcmx5X0lOUCIsImxhdGVfSU5QIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWMVJfaVZTTiIsIlYyUl9pVlNOIiwiaU9TTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIildCgpmaWdTXzRBIDwtIFZsblBsb3QobmV1cm9uLmludGVncmF0ZWQsIGZlYXR1cmVzPWMoIk5ldXJvZzEiKSwgc3BsaXQuYnk9ImNlbGxfdHlwZSIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMpICYgeGxhYigiQ2VsbCBUeXBlIikgJgogIHRoZW1lKGFzcGVjdC5yYXRpbz0xLGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCkscGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0zMikpCgpmaWdTXzRCIDwtIFZsblBsb3QobmV1cm9uLmludGVncmF0ZWQsIGZlYXR1cmVzPWMoIk5ldXJvZDEiKSwgc3BsaXQuYnk9ImNlbGxfdHlwZSIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMpICYgeGxhYigiQ2VsbCBUeXBlIikgJgogIHRoZW1lKGFzcGVjdC5yYXRpbz0xLGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCkscGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0zMikpCgpmaWdTXzRBQiA8LSBnZ2FycmFuZ2UoZmlnU180QSxmaWdTXzRCLGNvbW1vbi5sZWdlbmQ9VFJVRSxsZWdlbmQ9InJpZ2h0IixhbGlnbj0naHYnLG5jb2w9Mixucm93PTEpCgpmaWdTXzRBQgoKYGBgCgojIyBVTUFQIG9mIElOUCwgaVZTTiwgaU9TTiwgYW5kIG1PU04gY2VsbCB0eXBlcyAgCgpgYGB7cn0KCkRpbVBsb3QoaW5wLmludGVncmF0ZWQsIHB0LnNpemU9MSwgbGFiZWw9VFJVRSwgY29scz1uZXVyb24uY2VsbF90eXBlLmNvbG9ycywgbGFiZWwuc2l6ZT04LCByZXBlbD1UUlVFKSArIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpCgpgYGAKCiMjIE5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBvZiBjYW5kaWRhdGUgZ2VuZXMgZm9yIFYxUi9WMlIvT1NOIGxpbmVhZ2UgZGV0ZXJtaW5hdGlvbiAtIFYxUiBleHByZXNzaW5nIGdlbmVzICAKCmBgYHtyfQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTWVpczIiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJTY3QiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJGYW0xODNiIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTWlyMTAwaGciKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJBY2FkMTAiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpgYGAKCiMjIE5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBvZiBjYW5kaWRhdGUgZ2VuZXMgZm9yIFYxUi9WMlIvT1NOIGxpbmVhZ2UgZGV0ZXJtaW5hdGlvbiAgCgpgYGB7cn0KCkZlYXR1cmVQbG90KGlucC5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIlRmYXAyZSIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiRmV6ZjEiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCkZlYXR1cmVQbG90KGlucC5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIk9saWcyIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJUc2h6MiIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTmZpYiIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiQmNsMTFiIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpgYGAKCiMjIEZlYXR1cmUgcGxvdHMgb2Ygbm9ybWFsaXplZCBnZW5lIGV4cHJlc3Npb24gZm9yIGVhcmx5IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBiZXR3ZWVuIFYxUiwgVjJSLCBhbmQgT1NOIGxpbmVhZ2VzICAKCmBgYHtyfQoKY29ybmVyX3RoZW1lIDwtIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwKICAgICAgICAgICAgICAgICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKC0xLCAtMSwgMCwgLTEpLCAibnVsbCIpLAogICAgICAgICAgICAgICAgICAgICAgcGFuZWwubWFyZ2luID0gdW5pdChjKC0xLCAtMSwgMCwgLTEpLCAibnVsbCIpLAogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjQpLAogICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0zMiksCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgICAgICAgICAgICAgICBhc3BlY3QucmF0aW89MSkKCnlfdGhlbWUgPC0gdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLAogICAgICAgICAgICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gTkEpLAogICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKC0xLCAtMSwgMCwgLTEpLCAibnVsbCIpLAogICAgICAgICAgICAgICAgIHBhbmVsLm1hcmdpbiA9IHVuaXQoYygtMSwgLTEsIDAsIC0xKSwgIm51bGwiKSwKICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0zMiksCiAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgICAgICAgICAgIGFzcGVjdC5yYXRpbz0xKQoKeF90aGVtZSA8LSB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksCiAgICAgICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksCiAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoLTEsIC0xLCAwLCAtMSksICJudWxsIiksCiAgICAgICAgICAgICAgICAgcGFuZWwubWFyZ2luID0gdW5pdChjKC0xLCAtMSwgMCwgLTEpLCAibnVsbCIpLAogICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICAgICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTI0KSwKICAgICAgICAgICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTMyKSwKICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgICAgICAgICAgYXNwZWN0LnJhdGlvPTEpCiAgCmJsYW5rX3RoZW1lIDwtIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoLTEsIC0xLCAwLCAtMSksICJudWxsIiksCiAgICAgICAgICAgICAgICAgICAgIHBhbmVsLm1hcmdpbiA9IHVuaXQoYygtMSwgLTEsIDAsIC0xKSwgIm51bGwiKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MzIpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgICAgICAgICAgICAgIGFzcGVjdC5yYXRpbz0xKQoKYGBgCgpgYGB7cixmaWcud2lkdGg9MTYsZmlnLmhlaWdodD0xNn0KCmZpZ1NfNEMgPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiS3J0NyIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHlfdGhlbWUKCmZpZ1NfNEQgPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiS3J0OCIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIGJsYW5rX3RoZW1lCgpmaWdTXzRFIDwtIEZlYXR1cmVQbG90KGlucC5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIkVteDIiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICBibGFua190aGVtZQoKZmlnU180RiA8LSBGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJHbW5jIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgYmxhbmtfdGhlbWUKCmZpZ1NfNEcgPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiQ2RrbjFhIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgeV90aGVtZQoKZmlnU180SCA8LSBGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJNY2lkYXMiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICBibGFua190aGVtZQoKZmlnU180SSA8LSBGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJDZGsxIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgYmxhbmtfdGhlbWUKCmZpZ1NfNEogPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiUGhsZGExIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgYmxhbmtfdGhlbWUKCmZpZ1NfNEsgPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTWlzcCIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHlfdGhlbWUKCmZpZ1NfNEwgPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiQ2xtcCIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIGJsYW5rX3RoZW1lCgpmaWdTXzRNIDwtIEZlYXR1cmVQbG90KGlucC5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIlRwcHAzIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgYmxhbmtfdGhlbWUKCmZpZ1NfNE4gPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiSW5hIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgYmxhbmtfdGhlbWUKCmZpZ1NfNE8gPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTXNzNTEiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICBjb3JuZXJfdGhlbWUKCmZpZ1NfNFAgPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiRG5hc2UyYSIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHhfdGhlbWUKCmZpZ1NfNFEgPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiVGV4MTUiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICB4X3RoZW1lCgpmaWdTXzRSIDwtIEZlYXR1cmVQbG90KGlucC5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIkNyYWJwMSIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHhfdGhlbWUKCmdnYXJyYW5nZShmaWdTXzRDLGZpZ1NfNEQsZmlnU180RSxmaWdTXzRGLGZpZ1NfNEcsZmlnU180SCxmaWdTXzRJLGZpZ1NfNEosZmlnU180SyxmaWdTXzRMLGZpZ1NfNE0sZmlnU180TiwKICAgICAgICAgIGZpZ1NfNE8sZmlnU180UCxmaWdTXzRRLGZpZ1NfNFIsbnJvdz00LG5jb2w9NCxhbGlnbj0naHYnKQoKYGBgCgojIyBGZWF0dXJlIHBsb3RzIG9mIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBmb3IgTm90Y2gxIGFuZCBEbGw0ICAKCmBgYHtyLGZpZy53aWR0aD0xNixmaWcuaGVpZ2h0PTh9CgpmaWdTXzNTIDwtIEZlYXR1cmVQbG90KGlucC5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIk5vdGNoMSIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLjUsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCmZpZ1NfM1QgPC0gRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiRGxsNCIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLjUsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpnZ2FycmFuZ2UoZmlnU18zUyxmaWdTXzNULG5jb2w9MixhbGlnbj0naHYnKQoKYGBgCgo=